package com.passion.fs.core;

import com.passion.fs.entity.FileInfo;
import com.passion.fs.vo.FileInfoVO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;


/**
 * 类描述：文件存储系统顶级接口
 *
 * @author ZhuYin
 * @since 2024年12月28日
 */
public interface FileSystem {

    /**
     * 判断存储桶是否在存在
     *
     * @param bucket 桶名称
     * @return true 存在 false 不存在
     */
    boolean bucketExists(String bucket);

    /**
     * 创建存储桶
     *
     * @param bucket 桶名称
     */
    void makeBucket(String bucket);

    /**
     * 上传文件
     * @param userId 用户ID
     * @param file   上传的文件
     * @return 文件基本信息
     */
    FileInfoVO upload(String userId, MultipartFile file);

    /**
     * 上传文件
     *
     * @param userId  用户ID
     * @param bucket  要上传到的桶名称
     * @param file    上传的文件
     * @return 文件基本信息
     */
    FileInfoVO upload(String userId, String bucket, MultipartFile file);

    /**
     * 删除文件
     * 逻辑删除上传记录，文件依然保留
     * @param objectName 对象名称
     */
    void delete(String objectName);

    /**
     * 下载文件
     *
     * @param objectName 对象名称
     * @param response 响应
     */
    void download(String objectName, HttpServletResponse response);

    /**
     * 获取文件访问地址
     *
     * @param objectName 对象名称
     * @return 返回对象的访问地址
     */
    String getUrl(String objectName);

    /**
     * 批量上传文件
     *
     * @param userId     用户ID
     * @param dirId      目录ID
     * @param files      文件数组
     * @return 返回上传之后的文件集合信息
     * @author ZhuYin
     * @since 2025年01月06日
     */
    List<FileInfoVO> uploadFiles(String userId, String dirId, MultipartFile[] files);

    /**
     * 批量上传文件
     *
     * @param userId     用户ID
     * @param dirId      目录ID
     * @param bucketName 桶名称
     * @param files      文件数组
     * @return 返回上传之后的文件集合信息
     * @author ZhuYin
     * @since 2025年01月06日
     */
    List<FileInfoVO> uploadFiles(String userId, String dirId, String bucketName, MultipartFile[] files);

    /**
     * 方法说明：在指定文件夹下创建文件夹
     *
     * @param userId     操作用户ID
     * @param dirId      文件夹ID
     * @param folderName 文件夹名称
     * @return 类描述：文件业务对象
     * @author ZhuYin
     * @since 2025年01月08日
     */
    FileInfo createFolder(String userId, String dirId, String folderName);

}
